//import ... from ... 语句，从axios框架中导入axios组件
import axios from "axios";
import {clearToken, confirmMessage, getTokenName, showMessage} from "../util/utils.js";

//配置axios发送请求时的前缀路径
axios.defaults.baseURL = "http://localhost:8088";


// 添加请求拦截器
axios.interceptors.request.use( (config) => {
    // 在发送请求之前做些什么
    let token = window.sessionStorage.getItem(getTokenName());
    if (!token) { //表示token不存在，token的值是空，token没有值这个意思
        token = window.localStorage.getItem(getTokenName());
        if (token) { //表示token存在，token不是空，token有值，那就是从localStorage拿到token了，说明用户选择了“记住我”
            config.headers['rememberMe'] = true;
        }
    }
    if (token) { //表示token存在，token有值，token不是空这个意思
        //把token放入请求头中
        config.headers['Authorization'] = token;
    }
    return config;
}, (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use( (response) => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    if (response.data.code > 900) { //token有问题，提示用户需要重新去登录
        confirmMessage(response.data.msg + '，是否去重新登录？').then(() => { //点确定就触发then函数
            //把前端的token清理一下
            clearToken();
            //跳转到登录页
            window.location.href = "/";
        }).catch(() => { //点取消就触发catch函数
            showMessage('取消重新登录', 'warning')
        })
    }
    return response;
}, (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
});



//封装axios常用的四种请求方法
/**
 * 封装Get请求
 *
 * @param url =  '/api/login'
 * @param params = {
 *             id: 12345,
 *             no: 689562985,
 *             address: 'beijing'
 *         }
 */
export const doGet = (url, params) => {
    return axios.get(url, { //发送get请求，请求地址 url ，请求参数 params
        params: params
    })
}

/**
 * 封装post请求
 *
 * @param url = '/api/login'
 * @param data = {
 *         firstName: 'Fred',
 *         lastName: 'Flintstone'
 *     }
 */
export const doPost = (url, data) => {
    return axios.post(url, data) //发送post请求，请求地址是 url, 请求参数是 data
}

/**
 * 封装put请求
 *
 * @param url = '/api/login'
 * @param data = {
 *         firstName: 'Fred',
 *         lastName: 'Flintstone'
 *     }
 */
export const doPut = (url, data) => { //和post请求的代码是一样的，只是把请求方法改成put就可以了
    return axios.put(url, data); //发送post请求，请求地址是 url, 请求参数是 data
}

/**
 * 封装delete请求
 *
 * @param url =  '/api/login'
 * @param params = {
 *             id: 12345,
 *             no: 689562985,
 *             address: 'beijing'
 *         }
 */
export const doDelete = (url, params) => { //和get请求的代码是一样的，只是把请求方法改成delete就可以了
    return axios.delete(url, { //发送delete请求，请求地址 url ，请求参数 params
        params: params
    })
}

/**
 *
 * @param url
 * @param params = {
 *          name: 'zhangsan',
 *          phone: 'phone'
 *        }
 * @returns {Promise<axios.AxiosResponse<any>>}
 */
export function doDownload(url, params) {
    return axios({ //发送ajax的Get请求
        method: 'get',
        url: url,
        params: params,
        responseType: 'blob', // 设置为blob (很重要，一定要设置)
    })
}